package com.itheima.jdk;

import com.sun.javafx.binding.Logging;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName: Test6
 * @Description:
 * @Author liulihui
 * @Date: 2021/7/25 21:05
 * @URL：
 * @Version 1.0
 */
public class Test6 {
    public static void main(String[] args) {
        //这 个qq车 跟 proxy 有什么关系
        Car qq=new QQ();
        Car proxy =(Car) Proxy.newProxyInstance(
                Test6.class.getClassLoader(),
                new Class[]{Car.class},
                new Test6.MyInvocationHandler(qq));
        //返回对象 一定是  Car.class的子类!!!
        //造新车 只有在 被调用的方法 上有 #Logging注解的时候 才添加打印语句....
        proxy.start();
        proxy.stop();


    }
    //他才是真正的干活的对象
    private  static class MyInvocationHandler implements InvocationHandler {

        //原本对象的意思 ,想让原来对象在现在这个类中用,就必须引进当前类,方法就是把原来对象搞成当前类的一个属性.
        private  Car ori;
        public MyInvocationHandler(Car ori){
            this.ori=ori;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("______华丽的分割线__________");
            Object result;
            //应该判断的ori qq车的那个方法对象的上是否有注解!!
            Method method1 = ori.getClass().getMethod(method.getName(), method.getParameterTypes());
            if (method1.isAnnotationPresent((Class<? extends Annotation>) Logging.class)) {
                System.out.print("--------------华丽分割线--------");

                //使用原本那辆车的 方法!!!
                //
                //method对象.invoke(调用这个方法的对象,参数...)=============对象.方法(参数....)
                result = method.invoke(ori, args);

            } else {

                result = method.invoke(ori, args);
            }
            return result;
        }
    }
}